#include<iostream>
#include<string>
#include<cerrno>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>


void Usage(std::string proc)
{
    std::cout<<"Usage: \n\t" <<proc<<"server_ ip server_port"<<std::endl;

}


// ./udp_client sever_ip sever_port 使用客服端格式
int main(int argc,char *argv[])
{
    //输入少于3个，提示输入
    if(argc !=3){
        Usage(argv[0]);
        return 0; 
    }

    //创建套接字，打开网络文件
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock<0){
        std::cerr<<"socket error: "<<errno<<std::endl;
        return 1;
    }

    //client指明的端口号客户端不一定有，有可能被占用
    //client发送数据的时候，OS会自动bind，采用的是随机端口方式
    struct sockaddr_in server;
    server.sin_family=AF_INET;
    //atoi字符串转换为一个整数
    server.sin_port=htons(atoi(argv[2]));
    server.sin_addr.s_addr=inet_addr(argv[1]);

    //使用服务
    while(1)
    {

        std::string message;
        std::cout<<"输入#";
        std::cin>>message;

        sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));
        
        struct sockaddr_in tmp;
        socklen_t len=sizeof(tmp);
        char buffer[1024];
        recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&tmp,&len);
        std::cout<<"server echo# "<<buffer<<std::endl;
    }
    return 0;
}